/************** Zhihui *****************/
#pragma once
#include "OptimalRegion.h"
#include "contest_instance.h"
#include <tuple>
#include <unordered_map>
#include <vector>

namespace ieda_contest {

class ContestDataManager;

class FinalRegion : public OptimalRegion {

public:

    // 构造函数
    // TODO: getRowSize() = getRowEndIdx() - getRowBeginIdx() + 1。
    // 要求提供IdbGcellgrid水平和竖直各有多少个grid，case1为54和42。
    FinalRegion(ContestDataManager* data_manager)
        : OptimalRegion(data_manager) {
                _data_manager = data_manager;
                _2D_Supply_map = cal_2D_Supply_map();
                FinalPos = calFinalPos();
            }

    // return {BeginRowIdx, EndRowIdx, BeginColIdx, EndColIdx}
    std::tuple<int, int, int, int>
    getRegion(idb::IdbInstance *Cell) override;
    ~FinalRegion() = default;

    std::unordered_map<ContestCoord, int, std::hash<ContestCoord>> cal_2D_Supply_map();
    std::unordered_map<idb::IdbInstance *, std::pair<int, int>> calFinalPos();

    std::pair<int, int>
    getBestPositionOfOptimalRegion(idb::IdbInstance *CellPtr, int RowBeginIdx, int RowEndIdx, int ColBeginIdx, int ColEndIdx);

private:
    ContestDataManager* _data_manager = nullptr;  // 指向 DataManager 实例的指针

    std::unordered_map<ContestCoord, int, std::hash<ContestCoord>> _2D_Supply_map;
    std::unordered_map<idb::IdbInstance *, std::pair<int, int>> FinalPos;
    // FinalPos 是一个哈希映射，将每个cell映射到其最终的行列位置。
    
};
} // namespace ieda_contest